package kuang.pool;

import java.util.concurrent.*;

/**
 * ThreadPoolExecutor.AbortPolicy() 直接抛出异常
 * ThreadPoolExecutor.CallerRunsPolicy 那里来的回哪去，不会抛出异常（本例中，将多出的任务，交给main线程去做）
 * ThreadPoolExecutor.DiscardPolicy 队列满了，不会抛出异常，直接丢掉任务
 * ThreadPoolExecutor.DiscardOldestPolicy 不会抛出异常，尝试和最早的任务竞争，失败就抛弃
 */
public class Demo02 {
    public static void main(String[] args) {
        //获得系统的线程数，可以放到线程池的最大线程数那里去
        System.out.println(Runtime.getRuntime().availableProcessors());

        ExecutorService threadPool = new ThreadPoolExecutor(2,
                5,
                3,
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(3),
                Executors.defaultThreadFactory(),
                //这个拒绝策略是：银行满了（线程全被占用、阻塞队列已满），就抛出异常
                new ThreadPoolExecutor.CallerRunsPolicy());

        try {
            // 最大承载：Deque + max
            // 超过 RejectedExecutionException
            for (int i = 1; i <= 9; i++) {
            // 使用了线程池之后，使用线程池来创建线程
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + " ok");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 线程池用完，程序结束，关闭线程池
            threadPool.shutdown();
        }

    }
}
